/*
 * @Author: 0x9DEFA478
 * @Date: 2022-01-20 17:25:53
 * @LastEditTime: 2022-02-09 19:08:44
 * @LastEditors: 0x9DEFA478
 * @Description: 
 * QQ:2652450237
 * ============================================================================================================================================
 * 
 * 
 * 
 *                                                                                               ************      ****************************
 *                                                                                             ************      ****************************  
 *                                                                                           ************      ****************************    
 *                                                                                         ************      ****************************      
 *                                                                                       ************      ************                        
 *                                                                                     ************      ************                          
 *                                                                                   ************      ************                            
 *                                                                                 ************      ************                              
 *                                                                               ************      ************                                
 *                                                                             ************      ************                                  
 *                                                                           ************      ************                                    
 *                                                                         ************      ************                                      
 *                                                                       ************      ************                                        
 *                                                                     ************      ************                                          
 *                                                                   ************      ************                                            
 *                                                                 ************      ************                                              
 *                                                               ************      ************                                                
 *                                                             ************      ************                                                  
 *                                                           ************      ************                                                    
 *                                                         ************      ************                                                      
 *                                                       ************      ************                                                        
 *                                                     ************      ************                                                          
 *                                                   ************      ************                                                            
 *                                                 ************      ************                                                              
 *                                               ************      ************                                                                
 *                                             ************      ************                                                                  
 *                                           ************      ************                                                                    
 *                                         ************      ************                                                                      
 *                                       ************      ************                                                                        
 *                                     ************      ************                                                                          
 *                                   ************      ************                                                                            
 *                                 ************      ************                                                                              
 *                               ************      ************                                                                                
 *                             ************      ************                                                                                  
 *                           ************      ************                                                                                    
 *                         ************      ************                                                                                      
 *       ****************************      ************                                                                                        
 *     ****************************      ************                                                                                          
 *   ****************************      ************                                                                                            
 * ****************************      ************                                                                                              
 * 
 * 
 * 
 * ============================================================================================================================================
 * 
 */
#include "ST7789_SPI.h"
#include "ST7789_CMD.h"




static void Init(ST7789_SPI* _this){
  unsigned char* Buffer;

  Buffer=_this->CmdSequenceBuffer;

  _this->LL_Function.Reset(_this->LL_Function.v);

  Buffer[0]=vST7789_MADCTL;
  Buffer[1]=vST7789_MADCTL_Dir0;
  _this->LL_Function.SPI_Transmit(_this->LL_Function.v,&Buffer[0],1,&Buffer[1],1,-1);

  Buffer[0]=vST7789_COLMOD;
  Buffer[1]=0x55U;
  _this->LL_Function.SPI_Transmit(_this->LL_Function.v,&Buffer[0],1,&Buffer[1],1,-1);

  Buffer[0]=vST7789_FRCTRL2;
  Buffer[1]=0x01U; //0x01:111FPS
  _this->LL_Function.SPI_Transmit(_this->LL_Function.v,&Buffer[0],1,&Buffer[1],1,-1);

  // Buffer[0]=vST7789_PVGAMCTRL;
  // Buffer[1]=0xD0U;
  // Buffer[2]=0x04U;
  // Buffer[3]=0x0DU;
  // Buffer[4]=0x11U;
  // Buffer[5]=0x13U;
  // Buffer[6]=0x2BU;
  // Buffer[7]=0x3FU;
  // Buffer[8]=0x54U;
  // Buffer[9]=0x4CU;
  // Buffer[10]=0x18U;
  // Buffer[11]=0x0DU;
  // Buffer[12]=0x0BU;
  // Buffer[13]=0x1FU;
  // Buffer[14]=0x23U;
  // _this->LL_Function.SPI_Transmit(_this->LL_Function.v,&Buffer[0],1,&Buffer[1],14,-1);

  // Buffer[0]=vST7789_NVGAMCTRL;
  // Buffer[1]=0xD0U;
  // Buffer[2]=0x04U;
  // Buffer[3]=0x0CU;
  // Buffer[4]=0x11U;
  // Buffer[5]=0x13U;
  // Buffer[6]=0x2CU;
  // Buffer[7]=0x3FU;
  // Buffer[8]=0x44U;
  // Buffer[9]=0x51U;
  // Buffer[10]=0x2FU;
  // Buffer[11]=0x1FU;
  // Buffer[12]=0x1FU;
  // Buffer[13]=0x20U;
  // Buffer[14]=0x23U;
  // _this->LL_Function.SPI_Transmit(_this->LL_Function.v,&Buffer[0],1,&Buffer[1],14,-1);

  Buffer[0]=vST7789_INVON;
  _this->LL_Function.SPI_Transmit(_this->LL_Function.v,&Buffer[0],1,NULL,0,-1);

  Buffer[0]=vST7789_SLPOUT;
  _this->LL_Function.SPI_Transmit(_this->LL_Function.v,&Buffer[0],1,NULL,0,-1);

  Buffer[0]=vST7789_DISPON;
  _this->LL_Function.SPI_Transmit(_this->LL_Function.v,&Buffer[0],1,NULL,0,-1);


}

static void SetDisplayArea(ST7789_SPI* _this,int X,int Y,int W,int H){
  unsigned short* Buffer;

  Buffer=_this->CmdSequenceBuffer;

  X+=_this->X_Offset;
  Y+=_this->Y_Offset;

  Buffer[0]=vST7789_CASET;
  Buffer[1]=X;
  Buffer[2]=X+W-1;
  _this->LL_Function.SPI_Transmit16Bit(_this->LL_Function.v,&Buffer[0],1,&Buffer[1],2,-1);

  Buffer[0]=vST7789_RASET;
  Buffer[1]=Y;
  Buffer[2]=Y+H-1;
  _this->LL_Function.SPI_Transmit16Bit(_this->LL_Function.v,&Buffer[0],1,&Buffer[1],2,-1);
}





/**
 * @brief 设置刷新位置和大小 屏幕初始化(ST7789_ScreenInit())后使用
 * @param _this 要设置的对象
 * @param X X坐标
 * @param Y Y坐标
 * @param W 宽度
 * @param H 高度
 * @return 无
 */
void ST7789_SetDisplayArea(ST7789_SPI* _this,int X,int Y,int W,int H){
  
  _this->LL_Function.Lock(_this->LL_Function.v);

  _this->UpdateArea.X=X;
  _this->UpdateArea.Y=Y;
  _this->UpdateArea.W=W;
  _this->UpdateArea.H=H;

  SetDisplayArea(_this,X,Y,W,H);

  _this->LL_Function.Unlock(_this->LL_Function.v);
}

/**
 * @brief 设置显示方向 屏幕初始化(ST7789_ScreenInit())后使用
 *        注意! 调用此方法后必须调用一次ST7789_SetDisplayArea()
 * @param _this 要设置的对象
 * @param Direction 方向vST7789_SPI_Direction_
 * @return 无
 */
void ST7789_SetDirection(ST7789_SPI* _this,int Direction){
  unsigned char* Buffer;

  Buffer=_this->CmdSequenceBuffer;

  _this->LL_Function.Lock(_this->LL_Function.v);

  if(Direction==_this->Direction){
    goto Return;
  }

  Buffer[0]=vST7789_MADCTL;
  switch(Direction){
    case vST7789_SPI_Direction_0:
      _this->X_Offset=_this->GRAMArea.X;
      _this->Y_Offset=_this->GRAMArea.Y;
      Buffer[1]=vST7789_MADCTL_Dir0;
      break;
    case vST7789_SPI_Direction_90:
      _this->X_Offset=320-_this->GRAMArea.Y-_this->GRAMArea.H;
      _this->Y_Offset=_this->GRAMArea.X;
      Buffer[1]=vST7789_MADCTL_Dir90;
      break;
    case vST7789_SPI_Direction_180:
      _this->X_Offset=240-_this->GRAMArea.X-_this->GRAMArea.W;
      _this->Y_Offset=320-_this->GRAMArea.Y-_this->GRAMArea.H;
      Buffer[1]=vST7789_MADCTL_Dir180;
      break;
    case vST7789_SPI_Direction_270:
      _this->X_Offset=_this->GRAMArea.Y;
      _this->Y_Offset=240-_this->GRAMArea.X-_this->GRAMArea.W;
      Buffer[1]=vST7789_MADCTL_Dir270;
      break;
    default:
      for(;;){
      }
  }
  _this->LL_Function.SPI_Transmit(_this->LL_Function.v,&Buffer[0],1,&Buffer[1],1,-1);

  _this->Direction=Direction;
Return:
  _this->LL_Function.Unlock(_this->LL_Function.v);
}

/**
 * @brief 初始化屏幕
 * @param _this 要操作的对象
 * @return 无
 */
void ST7789_ScreenInit(ST7789_SPI* _this){

  _this->LL_Function.Lock(_this->LL_Function.v);

  Init(_this);
  SetDisplayArea(_this,_this->UpdateArea.X,_this->UpdateArea.Y,_this->UpdateArea.W,_this->UpdateArea.H);
  
  _this->Direction=vST7789_SPI_Direction_0;
  _this->IsDisplay=-1;
  _this->LL_Function.Unlock(_this->LL_Function.v);
}

/**
 * @brief 屏幕反初始化
 * @param _this 要操作的对象
 * @return 无
 */
void ST7789_ScreenDeInit(ST7789_SPI* _this){

  _this->LL_Function.Lock(_this->LL_Function.v);
  _this->IsDisplay=0;
  _this->LL_Function.Reset(_this->LL_Function.v);
  _this->LL_Function.Unlock(_this->LL_Function.v);
}

/**
 * @brief 屏幕句柄初始化
 * @param _this 要初始化的句柄
 * @param LL_Function 底层方法
 * @param X 有效GRAM X坐标
 * @param Y 有效GRAM Y坐标
 * @param W 有效GRAM 宽度
 * @param H 有效GRAM 高度
 * @return 无
 */
void ST7789_SPI_Init(ST7789_SPI* _this,ST7789_SPI_LL_Function* LL_Function,void* CmdSequenceBuffer
  ,int X,int Y,int W,int H){

  _this->CmdSequenceBuffer=CmdSequenceBuffer;

  _this->IsDisplay=0;

  _this->Direction=vST7789_SPI_Direction_0;
  _this->GRAMArea.X=X;
  _this->GRAMArea.Y=Y;
  _this->GRAMArea.W=W;
  _this->GRAMArea.H=H;

  _this->X_Offset=X;
  _this->Y_Offset=Y;

  _this->UpdateArea.X=0;
  _this->UpdateArea.Y=0;
  _this->UpdateArea.W=W;
  _this->UpdateArea.H=H;

  _this->LL_Function=LL_Function[0];

}



